package com.sqisland.android.graphics_demo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import java.util.Arrays; import java.util.List; public class ColorMatrixActivity extends SpinnerImageActivity { protected List<Option> getOptions(Bitmap original) { return Arrays.asList( new Option(getString(R.string.original), original), createOption(original, R.string.grayscale, getGrayscaleColorMatrix()), createOption(original, R.string.sepia, getSepiaColorMatrix()), createOption(original, R.string.binary, getBinaryColorMatrix()), createOption(original, R.string.invert, new ColorMatrix(new float[]{ -1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0 })), createOption(original, R.string.alpha_blue, new ColorMatrix(new float[]{ 0, 0, 0, 0, 0, 0.3f, 0, 0, 0, 50, 0, 0, 0, 0, 255, 0.2f, 0.4f, 0.4f, 0, -30 })), createOption(original, R.string.alpha_pink, new ColorMatrix(new float[]{ 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0.2f, 0, 0, 0, 50, 0.2f, 0.2f, 0.2f, 0, -20 })) ); } private Option createOption(Bitmap original, int titleId, ColorMatrix colorMatrix) { String title = getString(titleId); Bitmap bitmap = process(original, colorMatrix); return new Option(title, bitmap); } protected Bitmap process(Bitmap original, ColorMatrix colorMatrix) { Bitmap bitmap = Bitmap.createBitmap( original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); canvas.drawBitmap(original, 0, 0, paint); return bitmap; } private ColorMatrix getGrayscaleColorMatrix() { ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); return colorMatrix; } private ColorMatrix getSepiaColorMatrix() { ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrix colorScale = new ColorMatrix(); colorScale.setScale(1, 1, 0.8f, 1); // Convert to grayscale, then apply brown color colorMatrix.postConcat(colorScale); return colorMatrix; } private ColorMatrix getBinaryColorMatrix() { ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); float m = 255f; float t = -255*128f; ColorMatrix threshold = new ColorMatrix(new float[] { m, 0, 0, 1, t, 0, m, 0, 1, t, 0, 0, m, 1, t, 0, 0, 0, 1, 0 }); // Convert to grayscale, then threshold colorMatrix.postConcat(threshold); return colorMatrix; } }